package handler

import (
	"fitness/go-admin/internal/model"
	"fitness/go-admin/internal/service"
	"fitness/go-admin/pkg/errcode"
	"fitness/go-admin/pkg/logger"
	"fitness/go-admin/pkg/response"
	"strconv"

	"github.com/gin-gonic/gin"
)

// MenuHandler 菜单处理器
type MenuHandler struct {
	service service.MenuService
}

// NewMenuHandler 创建菜单处理器实例
func NewMenuHandler(service service.MenuService) *MenuHandler {
	return &MenuHandler{service: service}
}

// Create 创建菜单
// @Summary 创建菜单
// @Tags 菜单管理
// @Accept json
// @Produce json
// @Param request body model.Menu true "菜单信息"
// @Success 200 {object} response.Response
// @Router /api/v1/menus [post]
func (h *MenuHandler) Create(c *gin.Context) {
	var req model.Menu
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, errcode.BadRequest, "参数错误: "+err.Error())
		return
	}

	if err := h.service.CreateMenu(&req); err != nil {
		logger.Error("创建菜单失败", "error", err.Error())
		response.Error(c, errcode.InternalError, err.Error())
		return
	}

	response.Success(c, nil, "创建成功")
}

// List 获取菜单列表
// @Summary 获取菜单列表
// @Tags 菜单管理
// @Produce json
// @Success 200 {object} response.Response{data=[]model.MenuTree}
// @Router /api/v1/menus [get]
func (h *MenuHandler) List(c *gin.Context) {
	menus, err := h.service.GetMenuList()
	if err != nil {
		logger.Error("获取菜单列表失败", "error", err.Error())
		response.Error(c, errcode.InternalError, err.Error())
		return
	}

	response.Success(c, menus, "获取成功")
}

// Get 获取菜单详情
// @Summary 获取菜单详情
// @Tags 菜单管理
// @Produce json
// @Param id path int true "菜单ID"
// @Success 200 {object} response.Response{data=model.Menu}
// @Router /api/v1/menus/{id} [get]
func (h *MenuHandler) Get(c *gin.Context) {
	id, err := strconv.ParseUint(c.Param("id"), 10, 32)
	if err != nil {
		response.Error(c, errcode.BadRequest, "菜单ID格式错误")
		return
	}

	menu, err := h.service.GetMenuByID(uint(id))
	if err != nil {
		logger.Error("获取菜单详情失败", "menuId", id, "error", err.Error())
		response.Error(c, errcode.NotFound, "菜单不存在")
		return
	}

	response.Success(c, menu, "获取成功")
}

// Update 更新菜单
// @Summary 更新菜单
// @Tags 菜单管理
// @Accept json
// @Produce json
// @Param id path int true "菜单ID"
// @Param request body model.Menu true "菜单信息"
// @Success 200 {object} response.Response
// @Router /api/v1/menus/{id} [put]
func (h *MenuHandler) Update(c *gin.Context) {
	id, err := strconv.ParseUint(c.Param("id"), 10, 32)
	if err != nil {
		response.Error(c, errcode.BadRequest, "菜单ID格式错误")
		return
	}

	var req model.Menu
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, errcode.BadRequest, "参数错误: "+err.Error())
		return
	}

	if err := h.service.UpdateMenu(uint(id), &req); err != nil {
		logger.Error("更新菜单失败", "menuId", id, "error", err.Error())
		response.Error(c, errcode.InternalError, err.Error())
		return
	}

	response.Success(c, nil, "更新成功")
}

// Delete 删除菜单
// @Summary 删除菜单
// @Tags 菜单管理
// @Produce json
// @Param id path int true "菜单ID"
// @Success 200 {object} response.Response
// @Router /api/v1/menus/{id} [delete]
func (h *MenuHandler) Delete(c *gin.Context) {
	id, err := strconv.ParseUint(c.Param("id"), 10, 32)
	if err != nil {
		response.Error(c, errcode.BadRequest, "菜单ID格式错误")
		return
	}

	if err := h.service.DeleteMenu(uint(id)); err != nil {
		logger.Error("删除菜单失败", "menuId", id, "error", err.Error())
		response.Error(c, errcode.InternalError, err.Error())
		return
	}

	response.Success(c, nil, "删除成功")
}

// UpdateStatus 更新菜单状态
// @Summary 更新菜单状态
// @Tags 菜单管理
// @Accept json
// @Produce json
// @Param id path int true "菜单ID"
// @Param request body map[string]int true "状态信息"
// @Success 200 {object} response.Response
// @Router /api/v1/menus/{id}/status [put]
func (h *MenuHandler) UpdateStatus(c *gin.Context) {
	id, err := strconv.ParseUint(c.Param("id"), 10, 32)
	if err != nil {
		response.Error(c, errcode.BadRequest, "菜单ID格式错误")
		return
	}

	var req map[string]int
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, errcode.BadRequest, "参数错误: "+err.Error())
		return
	}

	status, ok := req["status"]
	if !ok {
		response.Error(c, errcode.BadRequest, "缺少状态参数")
		return
	}

	if status != 0 && status != 1 {
		response.Error(c, errcode.BadRequest, "状态参数错误")
		return
	}

	if err := h.service.UpdateMenuStatus(uint(id), status); err != nil {
		logger.Error("更新菜单状态失败", "menuId", id, "error", err.Error())
		response.Error(c, errcode.InternalError, err.Error())
		return
	}

	response.Success(c, nil, "更新成功")
}
